#ifndef MINER_STATES_HPP
#define MINER_STATES_HPP

#include <SmegTools/Pattern/Singleton.hpp>

#include <SmegCore/Game/State.hpp>
#include <SmegCore/Game/MessageInfo.hpp>

#include "../Entity/Miner.hpp"

//--------------------------------------------------------
class EnterMineAndDigForNugget : 
    public smeg::tools::Singleton< EnterMineAndDigForNugget >,
    public smeg::core::State< Miner > {

    DECLARE_SINGLETON_EMPTY_CTOR_DTOR( EnterMineAndDigForNugget )

public:
    virtual void    OnEnter( Miner* _pEntity );
    virtual void    OnUpdate( Miner* _pEntity );
    virtual void    OnExit( Miner* _pEntity );
};

//--------------------------------------------------------
class VisitBankAndDepositGold : 
    public smeg::tools::Singleton< VisitBankAndDepositGold >,
    public smeg::core::State< Miner > {

    DECLARE_SINGLETON_EMPTY_CTOR_DTOR( VisitBankAndDepositGold )

public:
    virtual void    OnEnter( Miner* _pEntity );
    virtual void    OnUpdate( Miner* _pEntity );
    virtual void    OnExit( Miner* _pEntity );
};

//--------------------------------------------------------
class QuenchThirst : 
    public smeg::tools::Singleton< QuenchThirst >,
    public smeg::core::State< Miner > {

    DECLARE_SINGLETON_EMPTY_CTOR_DTOR( QuenchThirst )

public:
    virtual void    OnEnter( Miner* _pEntity );
    virtual void    OnUpdate( Miner* _pEntity );
    virtual void    OnExit( Miner* _pEntity );
};

//--------------------------------------------------------
class GoHomeAndSleepTilRested : 
    public smeg::tools::Singleton< GoHomeAndSleepTilRested >,
    public smeg::core::State< Miner > {
        
    DECLARE_SINGLETON_EMPTY_CTOR_DTOR( GoHomeAndSleepTilRested )

public:
    virtual void    OnEnter( Miner* _pEntity );
    virtual void    OnUpdate( Miner* _pEntity );
    virtual void    OnExit( Miner* _pEntity );

    virtual bool    HandleMessage( Miner* _pEntity, const smeg::core::MessageInfo& _msg );
};

//--------------------------------------------------------
class EatStew : 
    public smeg::tools::Singleton< EatStew >,
    public smeg::core::State< Miner > {
        
    DECLARE_SINGLETON_EMPTY_CTOR_DTOR( EatStew )

public:
    virtual void    OnEnter( Miner* _pEntity );
    virtual void    OnUpdate( Miner* _pEntity );
    virtual void    OnExit( Miner* _pEntity );
};

#endif // MINER_STATES_HPP